package originala;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.util.Observable;
import java.util.Date;
import java.util.Vector;

/**
 * Bigarren mailako antolatzeko klasea
 */

class ErreserbaSistema extends Observable
{
    
    private Erreserba LoturaErreserba;
    private Bidaiariak loturaBidaiariak;
    AplikazioDatuBase datuBasea;
    private ZorizkoZenbakiaInterfazea zorizkozenb;
	

    public ErreserbaSistema() throws MalformedURLException, RemoteException, NotBoundException
    {
        
    	datuBasea = new AplikazioDatuBase();
    	loturaBidaiariak = new Bidaiariak();
 
    	if (System.getSecurityManager()!=null)
    		System.setSecurityManager(new RMISecurityManager());
		String zerbIzena  = "rmi://localhost/zorizkozenbakia";
		zorizkozenb = (ZorizkoZenbakiaInterfazea)Naming.lookup(zerbIzena);

    }
    


    public void ezeztatu()
    {
        // Erreserba sortu
        LoturaErreserba = null;
        // Bistak ohararazi 
        setChanged();
        super.notifyObservers();
    }
    /**
     * Hemen metodoaren deskribapena sartu.
     * @param zerbitzuarenKodea java.lang.String
     * @param eskeinitakoData java.util.Date
     */
    public void sartuIrteera(
        int baieztapenZenbakia,
        String irteerarenKodea,
        Date eskeinitakoData)
    {
        // Irtera bilatu eta erreserba bat eskatu
        

        System.out.println("Irteeraren kodea  " + irteerarenKodea + " data " + eskeinitakoData);
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
    }  
    
    /**
     * Gainkargatuta date ordez string erabiltzeko
     * @param zerbitzuarenKodea java.lang.String
     * @param eskeinitakoData java.util.Date
     */
    public void sartuIrteera(
        int baieztapenZenbakia,
        String irteerarenKodea,
        String eskeinitakoData)
    {
        // Irtera bilatu eta erreserba bat eskatu
        

        System.out.println("Irteeraren kodea  " + irteerarenKodea + " data " + eskeinitakoData);
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
    }

    /**
     * Hemen metodoaren deskribapena sartu.
     * @param izena java.lang.String
     * @param helbidea java.lang.String
     * @param telefonoa java.lang.String
     */
    public void sartuTurista(String nan, String izena, String abizena,  String helbidea, String telefonoa, int baiZenb)

    {
        System.out.println("Turistaren izena " + izena);
        //erreserba zenbakia sartu behar da
        
        loturaBidaiariak.sartuTurista(nan, izena, abizena, helbidea, telefonoa, baiZenb);
        System.out.println("turista vector-en sartuta");

        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
    }
    
    public void turistakSartu(){
    	Vector bidaiariak = loturaBidaiariak.getBidaiariak();
    	int baiZenb = 0;
    	for (int i=0; i<bidaiariak.size();i++)
    	{
    		Bidaiaria bid= (Bidaiaria) bidaiariak.elementAt(i);
    		baiZenb = bid.getBaiZenb();
    		datuBasea.sartuTurista( bid.getNan(),bid.getIzena(), bid.getAbizena(), bid.getHelbidea(),bid.getTelefonoa(), bid.getBaiZenb());
    	}
    	Ordaintzailea orda = loturaBidaiariak.getOrdaintzailea();
    	datuBasea.sartuOrdaintzailea(orda.getNan(),orda.getIzena(), orda.getAbizena(), orda.getHelbidea(), orda.getTelefonoa(), baiZenb, orda.getTxartela());
    }

	public void sartuOrdaintzailea(String nan, String izena, String abizena, String helbidea, String telefonoa, int baiZenb, String txartela) {
        loturaBidaiariak.sartuOrdaintzailea(nan, izena, abizena, helbidea, telefonoa, baiZenb,txartela);
        System.out.println("ordaintzailea sartuta");
        
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
	
	}
    public Erreserba getLoturaErreserba()
    {
        return LoturaErreserba;
    }

 /**
    * @return total double
	* @throws RemoteException 
     * @throws NotBoundException 
     * @throws MalformedURLException 	
    */
	public Integer erreserbaBerria(int pertsonaKopurua, String irteeraHandizkariarenIdentifikatzailea, String data, String bidaia, int prezioa) throws RemoteException, MalformedURLException, NotBoundException {

        int zorizkoa=zorizkozenb.balioaLortu(1000);
        
        // Erreserba agentea bilatu eta erreserba antolatzeko eskatu
        System.out.println(
            "Erreserba  " + pertsonaKopurua + " pertsonentzat  " + irteeraHandizkariarenIdentifikatzailea +" agentearekin ");
        int agenteId = datuBasea.getAgentearenZenbakia(irteeraHandizkariarenIdentifikatzailea);
        //erreserba berri bat sortu 
        LoturaErreserba = new Erreserba(new Integer(zorizkoa),new Integer(pertsonaKopurua),new Integer(agenteId),data,bidaia,prezioa);
        if (LoturaErreserba == null)
        	System.out.println("null da");
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
        return new Integer(zorizkoa);
	}

    public void setLoturaErreserba(Erreserba newLoturaErreserba)
    {
        LoturaErreserba = newLoturaErreserba;
    }


    /**
     * Hemen metodoaren deskribapena sartu
     */
    public int submit()
    {
        
        System.out.println("Datubasera bidali da");
        //data null da berak hartzen duelako uneko data
        int ondo = datuBasea.sartuErreserba(LoturaErreserba.getErreserbaZenbakia(),LoturaErreserba.getErreserbaUnea(), LoturaErreserba.getPertsonaKopurua(), LoturaErreserba.getAgentea());
        LoturaErreserba = null;
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
        return ondo;
    }
    
    public Vector lortuBidaiak(){
    	Vector<String> bidaiIzenak = new Vector<String>();
    	Vector bidaiak = datuBasea.irakurriBidaiak();
    	for(int i=0;i<bidaiak.size();i++){
    		Bidaia bid = (Bidaia) bidaiak.elementAt(i);
    		bidaiIzenak.addElement(bid.getDeskribapena());
    	}
    	return bidaiIzenak;
    }


    public Vector<String> lortuBidaiak(String agentea) {
    	Vector<String> bidaiIzenak = new Vector<String>();
    	Vector bidaiak = datuBasea.irakurriBidaiak(agentea);
    	if (bidaiak == null)
    		return null;
    	for(int i=0;i<bidaiak.size();i++){
    		Bidaia bid = (Bidaia) bidaiak.elementAt(i);
    		bidaiIzenak.addElement(bid.getDeskribapena());
    	}
    	return bidaiIzenak;
    }

	public Vector lortuAgenteak() {
		
		return datuBasea.irakurriAgenteak();
	}



	public Vector lortuAgenteIzenak() {
		Vector agenteak = datuBasea.irakurriAgenteak();
		Vector<String> izenak = new Vector<String>();
		for (int i=0;i<agenteak.size();i++){
	    	Agentea age = (Agentea) agenteak.elementAt(i);
	    	izenak.addElement(age.getIzena());
	    }
		return izenak;
	}



	public Vector<String> lortuDatak(String bidaia) {
		Vector<String> emaitza = datuBasea.lortuDatak(bidaia);
		for (int i=0;i<emaitza.size();i++){
	    	System.out.println(emaitza.elementAt(i));
	    }
		return emaitza;
		
	}



	public String getErreserbaUnea() {
		return LoturaErreserba.getErreserbaUnea();
	}



	public String getPrezioa() {
		return new Integer(LoturaErreserba.getPrezioa()).toString();
	}



	public Integer getAgentea() {
		return LoturaErreserba.getAgentea();
	}



	public String getErreserbaZenbakia() {
		return new Integer(LoturaErreserba.getErreserbaZenbakia()).toString();
	}



	public int lortuPrezioa(String bidaia) {
		return datuBasea.getPrezioa(bidaia);
	}



	public Ordaintzailea getOrdaintzailea() {
		return loturaBidaiariak.getOrdaintzailea();
	}










}
